package 哈希表;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @PackageName: 哈希表
 * @ClassName: LeetCode1169
 * @Author: chen jinxu
 * @Date: 2023/6/17 22:17
 * @Description: //查询无效交易
 * <p>
 * 如果出现下述两种情况，交易 可能无效：
 * <p>
 * 交易金额超过$1000
 * 或者，它和另一个城市中 同名 的另一笔交易相隔不超过 60 分钟（包含 60 分钟整）
 * 给定字符串数组交易清单transaction。每个交易字符串transactions[i]由一些用逗号分隔的值组成，这些值分别表示交易的名称，
 * 时间（以分钟计），金额以及城市。
 * 返回transactions，返回可能无效的交易列表。你可以按 任何顺序 返回答案。
 * 输入：transactions = ["alice,20,800,mtv","alice,50,100,beijing"]
 * 输出：["alice,20,800,mtv","alice,50,100,beijing"]
 * 解释：第一笔交易是无效的，因为第二笔交易和它间隔不超过 60 分钟、名称相同且发生在不同的城市。同样，第二笔交易也是无效的。
 * 输入：transactions = ["alice,20,800,mtv","alice,50,1200,mtv"]
 * 输出：["alice,50,1200,mtv"]
 * 输入：transactions = ["alice,20,800,mtv","bob,50,1200,mtv"]
 * 输出：["bob,50,1200,mtv"]
 * transactions.length <= 1000
 * 每笔交易transactions[i]按"{name},{time},{amount},{city}"的格式进行记录
 * 每个交易名称{name}和城市{city}都由小写英文字母组成，长度在1到10之间
 * 每个交易时间{time}由一些数字组成，表示一个0到1000之间的整数
 * 每笔交易金额{amount}由一些数字组成，表示一个0 到2000之间的整数
 */
public class LeetCode1169 {
    public static void main(String[] args) {
        System.out.println(invalidTransactions(new String[]{"alice,20,800,mtv", "alice,50,100,beijing"}));
        System.out.println(invalidTransactions(new String[]{"alice,20,800,mtv", "alice,50,1200,mtv"}));
        System.out.println(invalidTransactions(new String[]{"alice,20,800,mtv", "bob,50,1200,mtv"}));
    }

    public static List<String> invalidTransactions(String[] transactions) {
        List<String> result = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        int length = transactions.length;
        for (int i = 0; i < length; i++) {
            map.putIfAbsent(getName(transactions[i]), transactions[i]);
            if (getAmount(transactions[i]) > 1000) {
                result.add(transactions[i]);
                map.put(getName(transactions[i]), transactions[i]);
                continue;
            }
            if (map.containsKey(getName(transactions[i]))) {
                String mapValue = map.get(getName(transactions[i]));
                if (!(getCity(mapValue).equals(getName(transactions[i]))) && ((getTime(transactions[i]) - getTime(mapValue)) <= 60)) {
                    if (!result.contains(mapValue)) {
                        result.add(mapValue);
                    }
                    if (!result.contains(transactions[i])) {
                        result.add(transactions[i]);
                    }
                }
            }
        }
        return result;
    }

    public static String getName(String str) {
        String[] split = str.split(",");
        return split[0];
    }

    public static String getCity(String str) {
        String[] split = str.split(",");
        return split[3];
    }

    public static int getAmount(String str) {
        String[] split = str.split(",");
        return Integer.parseInt(split[2]);
    }

    public static int getTime(String str) {
        String[] split = str.split(",");
        return Integer.parseInt(split[1]);
    }

}
